home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / 68kdis.zip / FILE.C < prev    next >
C/C++ Source or Header  |  1988-12-03  |  4KB  |  217 lines

  1. /*
  2.  *    SCCS:    @(#)file.c    1.2    11/2/84    14:17:35
  3.  *    Various operations on files.
  4.  *
  5.  ***********************************************************************
  6.  *    This software is copyright of
  7.  *
  8.  *        John M Collins
  9.  *        47 Cedarwood Drive
  10.  *        St Albans
  11.  *        Herts, AL4 0DN
  12.  *        England            +44 727 57267
  13.  *
  14.  *    and is released into the public domain on the following conditions:
  15.  *
  16.  *        1.  No free maintenance will be guaranteed.
  17.  *        2.  Nothing may be based on this software without
  18.  *            acknowledgement, including incorporation of this
  19.  *            notice.
  20.  *
  21.  *    Notwithstanding the above, the author welcomes correspondence and bug
  22.  *    fixes.
  23.  ***********************************************************************
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <a.out.h>
  28. #include <ldfcn.h>
  29. #include "unc.h"
  30.     
  31. long    lseek();
  32. void    unimpl();
  33.  
  34. /*
  35.  *    Validate addr and get text entry corresponding to it from the given
  36.  *    file.
  37.  */
  38.  
  39. void    gette(fid, addr, te)
  40. register  ef_fid  fid;
  41. register  long    addr;
  42. t_entry    *te;
  43. {
  44.     addr -= fid->ef_tbase;
  45.     if  (addr < 0x300000 && 
  46.          (addr < 0  ||  addr > fid->ef_tsize  || (addr & 1) != 0))  
  47.      {
  48.         (void) fprintf(stderr, "Invalid text address %lx\n", addr);
  49.         exit(200);
  50.      }
  51.     (void) lseek(fid->ef_t, (long)(addr * sizeof(t_entry)/2), 0);
  52.     if  (read(fid->ef_t, (char *) te, sizeof(t_entry)) != sizeof(t_entry))  {
  53.         (void) fprintf(stderr, "Trouble reading text at %lx\n", addr);
  54.         exit(201);
  55.     }
  56. }
  57.  
  58. /*
  59.  *    Store a text entry.
  60.  */
  61.  
  62. void    putte(fid, addr, te)
  63. register  ef_fid  fid;
  64. register  long    addr;
  65. t_entry    *te;
  66. {
  67.     addr -= fid->ef_tbase;
  68.     if  (addr < 0x300000 &&
  69.          (addr < 0  ||  addr > fid->ef_tsize  ||  (addr & 1) != 0))
  70.      {
  71.         (void) fprintf(stderr, "Invalid text address %lx\n", addr);
  72.         exit(200); 
  73.      }
  74.     (void) lseek(fid->ef_t, (long)(addr * sizeof(t_entry)/2), 0);
  75.     (void) write(fid->ef_t, (char *) te, sizeof(t_entry));
  76. }
  77.  
  78. /*
  79.  *    Validate addr and get data entry corresponding to it from the given
  80.  *    file.
  81.  */
  82.  
  83. void    getde(fid, addr, de)
  84. register  ef_fid  fid;
  85. register  long    addr;
  86. d_entry    *de;
  87. {
  88.     if  (addr < 0x300000 && (addr < fid->ef_dbase  ||  addr > fid->ef_end))
  89.      {
  90.         (void) fprintf(stderr, "Invalid data address %lx\n", addr);
  91.         exit(200);
  92.      }
  93.     addr -= fid->ef_dbase;
  94.     (void) lseek(fid->ef_d, (long)(addr * sizeof(d_entry)), 0);
  95.     if  (read(fid->ef_d, (char *) de, sizeof(d_entry)) != sizeof(d_entry))  {
  96.         (void) fprintf(stderr, "Trouble reading data at %lx\n", addr);
  97.         exit(201);
  98.     }
  99. }
  100.  
  101. /*
  102.  *    Store a data entry.
  103.  */
  104.  
  105. void    putde(fid, addr, de)
  106. register  ef_fid  fid;
  107. register  long    addr;
  108. d_entry    *de;
  109. {
  110.     if  (addr < 0x300000 &&
  111.          (addr < fid->ef_dbase  ||  addr > fid->ef_end))
  112.      {
  113.         (void) fprintf(stderr, "Invalid data address %lx\n", addr);
  114.         exit(200);
  115.      }
  116.     addr -= fid->ef_dbase;
  117.     (void) lseek(fid->ef_d, (long)(addr * sizeof(d_entry)), 0);
  118.     (void) write(fid->ef_d, (char *) de, sizeof(d_entry));
  119. }
  120.  
  121. /*
  122.  *    Set type and length of given data entry.
  123.  */
  124.  
  125. void    setde(fid, addr, type, lng)
  126. ef_fid    fid;
  127. long    addr;
  128. unsigned  type;
  129. int    lng;
  130. {
  131.     d_entry    dat;
  132.  
  133.     if  (addr > fid->ef_end)
  134.         return;
  135.     getde(fid, addr, &dat);
  136.     if  (type == D_CONT  &&  dat.d_reloc != R_NONE)  {
  137.         char    obuf[30];
  138.         (void) sprintf(obuf, "overlapped reloc 0x%x", addr);
  139.         unimpl(obuf);
  140.     }
  141.     dat.d_type = type;
  142.     dat.d_lng = lng;
  143.     putde(fid, addr, &dat);
  144. }
  145.     
  146. /*
  147.  *    Get a word of data file, size as requested.
  148.  */
  149.  
  150. long    getdw(fid, pos, size)
  151. register  ef_fid  fid;
  152. long    pos;
  153. int    size;
  154. {
  155.     d_entry    dat;
  156.     register  long    res;
  157.     register  int    i, lt;
  158.     
  159.     getde(fid, pos, &dat);
  160.     
  161.     switch  (size)  {
  162.     case  R_BYTE:
  163.         return    dat.d_contents;
  164.         
  165.     case  R_LONG:
  166.         lt = 4;
  167.         goto  rest;
  168.         
  169.     case  R_WORD:
  170.         lt = 2;
  171.     rest:
  172.         res = dat.d_contents;
  173.         for  (i = 1;  i < lt; i++)  {
  174.             getde(fid, pos+i, &dat);
  175.             res = (res << 8) + dat.d_contents;
  176.         }
  177.         return    res;
  178.         
  179.     default:
  180.         (void) fprintf(stderr, "Data word size error\n");
  181.         exit(20);
  182.     }
  183.     /*NOTREACHED*/
  184. }
  185.  
  186. /*
  187.  *    Get a word of text file.
  188.  */
  189.  
  190. long    gettw(fid, pos, size)
  191. register  ef_fid  fid;
  192. long    pos;
  193. int    size;
  194. {
  195.     t_entry    tex;
  196.     long    res;
  197.     
  198.     gette(fid, pos, &tex);
  199.     
  200.     switch  (size)  {
  201.     case  R_BYTE:
  202.         return    tex.t_contents >> 8;
  203.         
  204.     case  R_WORD:
  205.         return    tex.t_contents;
  206.         
  207.     case  R_LONG:
  208.         res = tex.t_contents;
  209.         gette(fid, pos+2, &tex);
  210.         return    (res << 16) + tex.t_contents;
  211.     default:
  212.         (void) fprintf(stderr, "Text< word size error\n");
  213.         exit(20);
  214.     }
  215.     /*NOTREACHED*/
  216. }
  217.